Các yếu tố không đổi Phân_tích_thuật_toán

Phân tích các thuật toán thường tập trung vào hiệu suất tiệm cận, đặc biệt ở cấp sơ bộ, nhưng trong các ứng dụng thực tế, các yếu tố không đổi là quan trọng và trong thực tế, dữ liệu trong thực tế luôn bị giới hạn về kích thước. Giới hạn thường là kích thước của bộ nhớ có thể gắn địa chỉ, do đó, trên các máy 32 bit 2 32 = 4 GiB (lớn hơn nếu sử dụng bộ nhớ được phân đoạn) và trên các máy 64 bit 2 64 = 16 EiB. Do đó với một kích thước giới hạn, một thứ tự tăng trưởng (thời gian hoặc không gian) có thể được thay thế bằng một yếu tố không đổi và theo nghĩa này, tất cả các thuật toán thực tế là O (1) cho hằng số đủ lớn hoặc cho dữ liệu đủ nhỏ.

Giải thích này chủ yếu hữu ích cho các hàm phát triển cực kỳ chậm: logarit lặp (nhị phân) (log *) nhỏ hơn 5 cho tất cả dữ liệu thực tế (2 65536 bit); (nhị phân) log-log (log log n) nhỏ hơn 6 đối với hầu như tất cả dữ liệu thực tế (2 64 bit); và log nhị phân (log n) nhỏ hơn 64 đối với hầu như tất cả dữ liệu thực tế (2 64 bit). Tuy nhiên, thuật toán có độ phức tạp không liên tục có thể hiệu quả hơn thuật toán có độ phức tạp không đổi trên dữ liệu thực tế nếu chi phí của thuật toán thời gian không đổi dẫn đến hệ số hằng lớn hơn, ví dụ: K > k log ⁡ log ⁡ n {\displaystyle K>k\log \log n} miễn là K / k > 6 {\displaystyle K/k>6} và n < 2 2 6 = 2 64 {\displaystyle n<2^{2^{6}}=2^{64}} Đối với các yếu tố tuyến tính hoặc bậc hai dữ liệu lớn không thể bị bỏ qua, nhưng đối với dữ liệu nhỏ, thuật toán không hiệu quả đôi khi có thể hiệu quả hơn. Điều này đặc biệt được sử dụng trong các thuật toán lai, như Timsort, sử dụng thuật toán hiệu quả bất đối xứng (ở đây là sắp xếp trộn, với độ phức tạp thời gian n log ⁡ n {\displaystyle n\log n} ), nhưng chuyển sang một thuật toán không hiệu quả không có triệu chứng (ở đây sắp xếp chèn, với độ phức tạp thời gian n 2 {\displaystyle n^{2}} ) cho dữ liệu nhỏ, vì thuật toán đơn giản nhanh hơn trên dữ liệu nhỏ.